package database;

import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;

import org.joda.time.LocalDate;
import org.joda.time.LocalTime;
import org.uqbar.commons.utils.Observable;

import applicationModels.IntObservable;
import modelo.Asignacion;
import modelo.Dia;
import modelo.Empleado;
import modelo.Horario;
import modelo.Planificacion;

@Observable
public class Tienda {

	private List<Empleado> empleados;
	private List<Planificacion> planificaciones;
	private int sigLegajo;
	private static Tienda instance;
	
	
	private Tienda(){
		this.empleados = new ArrayList<Empleado>();
		this.planificaciones= new ArrayList<Planificacion>();
		sigLegajo=1;
	}
	
	public static Tienda getInstance(){
		if(instance == null){
			instance = new Tienda();
			instance.inicializarDatos();
		}
		return instance;
	}

	public List<Empleado> getEmpleados() {
		return empleados;
	}

	public void setEmpleados(List<Empleado> empleados) {
		this.empleados = empleados;
	}
	
	public void guardarEmpleado(Empleado empleado){
		if(!this.existeEmpleado(empleado)){
			this.empleados.add(empleado);
			sigLegajo=sigLegajo+1;
		}
	}
	
	private boolean existeEmpleado(Empleado nuevoEmpleado) {
		for(Empleado empleado:empleados){
			if(empleado.getLegajo()==nuevoEmpleado.getLegajo()){
				return true;
			}
		}
		return false;
	}

	public void quitarEmpleado(Empleado empleado){
		empleados.remove(empleado);
	}
	
	public List<Planificacion> getPlanificaciones(){
		return planificaciones;
	}
	
	public void setPlanificaciones(List<Planificacion> planificaciones){
		this.planificaciones=planificaciones;
	}
	
	public void agregarPlanificacion(Planificacion planificacion){
		this.getPlanificaciones().remove(planificacion);
		this.getPlanificaciones().add(planificacion);
		
	}
	
	public void quitarPlanificacion(Planificacion planificacion){
		planificaciones.remove(planificacion);
	}

	public int getSigLegajo() {
		return sigLegajo;
	}

	public List<Empleado> buscar(LocalDate fecha, IntObservable inicio, IntObservable fin) {
		Horario h = new Horario(inicio,fin);
	
		List<Empleado> ret = new ArrayList<Empleado>();
		
		for (Empleado e : this.getEmpleados()){
			if(e.estaDisponible(Dia.getDia(fecha), h)){
				ret.add(e);
			}
		}
		return ret;
	}
	
	public List<IntObservable> listaInts(int desde, int hasta) {

		List<IntObservable> ret = new ArrayList<IntObservable>();

		for (int i = desde; i < (hasta + 1); i++) {
			if (i > 23) {
				return ret;
			}
			ret.add(new IntObservable(i));
		}

		return ret;

	}
	
	public List<Planificacion> buscarPlanificacionesDesdeHasta(LocalDate inicio,LocalDate fin){
		List<Planificacion> resultados=new ArrayList<Planificacion>();
		for(Planificacion plani:planificaciones){
			if(plani.getFecha().isAfter(inicio)&&plani.getFecha().isBefore(fin)){
				resultados.add(plani);
			}
		}
		return resultados;
	}
	
	private void inicializarDatos(){
		Empleado empleado1=new Empleado("Obi-Wan" , "Kenobi");
		Tienda.getInstance().guardarEmpleado(empleado1);
				
		Empleado empleado2=new Empleado("Luke" , "Skywalker");
		Tienda.getInstance().guardarEmpleado(empleado2);
		
		Empleado empleado3=new Empleado("Han" , "Solo");
		Tienda.getInstance().guardarEmpleado(empleado3);
		
		LocalDate hoy=new LocalDate();
		
		Horario turnoMañana=new Horario(new IntObservable(6), new IntObservable(12));
		Horario turnoTarde=new Horario(new IntObservable(12), new IntObservable(18));
		Horario turnoNoche=new Horario(new IntObservable(18), new IntObservable(23));
		
		Asignacion mañana = new Asignacion(hoy,turnoMañana);
		Asignacion tarde = new Asignacion(hoy,turnoTarde);
		Asignacion noche = new Asignacion(hoy,turnoNoche);
		mañana.setEmpleadoAsignado(empleado1);
		tarde.setEmpleadoAsignado(empleado2);
		noche.setEmpleadoAsignado(empleado3);
		
		Planificacion planificacionHoy = new Planificacion(hoy);
		planificacionHoy.agregarAsignacion(mañana);
		planificacionHoy.agregarAsignacion(tarde);
		planificacionHoy.agregarAsignacion(noche);
		
		Tienda.getInstance().agregarPlanificacion(planificacionHoy);
		
		hoy=hoy.plusDays(1);

		mañana = new Asignacion(hoy,turnoMañana);
		tarde = new Asignacion(hoy,turnoTarde);
		noche = new Asignacion(hoy,turnoNoche);
		mañana.setEmpleadoAsignado(empleado2);
		tarde.setEmpleadoAsignado(empleado3);
//		noche.setEmpleadoAsignado(empleado1);		//nadie a la noche porque nos vamos de joda!
		
		planificacionHoy = new Planificacion(hoy);
		planificacionHoy.agregarAsignacion(mañana);
		planificacionHoy.agregarAsignacion(tarde);
		planificacionHoy.agregarAsignacion(noche);
		
		Tienda.getInstance().agregarPlanificacion(planificacionHoy);
				
		hoy=hoy.plusDays(1);

		mañana = new Asignacion(hoy,turnoMañana);
		tarde = new Asignacion(hoy,turnoTarde);
		noche = new Asignacion(hoy,turnoNoche);
		mañana.setEmpleadoAsignado(empleado3);		//laburamos hasta el mediodia nomas
//		tarde.setEmpleadoAsignado(empleado1);
//		noche.setEmpleadoAsignado(empleado2);
		
		planificacionHoy = new Planificacion(hoy);
		planificacionHoy.agregarAsignacion(mañana);
		planificacionHoy.agregarAsignacion(tarde);
		planificacionHoy.agregarAsignacion(noche);
		
		Tienda.getInstance().agregarPlanificacion(planificacionHoy);
		
	}


}
